#ifndef svl_TNodeS_H
#define svl_TNodeS_H

/**********
#include <TypeInfo.h>
#include <string>
#include <stdlib.h>
//#include <cstringt.h>
#include <comutil.h>
#include <stdio.h>
//#include <atltime.h>
#include <atlcomtime.h>

//#include <atlbase.h>
//#include <atlwin.h>
#include "svl_TWindow.h"

#pragma warning(disable : 4355)
#pragma warning(disable : 4996)
    
#define svl_Except void Except(char *S)\
  {svl::TExcept(svl::TString() << typeid(*this).name() << "::" << S).Throw();}

#define svl_ClassName(V) typeid(V).name()
****************/

#include "svl.h"
#include "svl_TVariant.h"

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

namespace svl
{
////////////////////////////////////////////////////////////////////////////////
struct TNodeS;
////////////////////////////////////////////////////////////////////////////////

struct TNodeSArray : /*public TMapped ,*/ public TArray //, public TDebug
{
  TNodeS *Parent;
  //
  TNodeSArray(TNodeS *Parent = NULL) { this->Parent = Parent;}
  //
  void AddFirst                 (TNodeS *AddNode,bool EnDelete = true);
  void AddLast                  (TNodeS *AddNode,bool EnDelete = true);
  void AddUp   (TNodeS *CurrNode,TNodeS *AddNode,bool EnDelete = true);
  void AddDown (TNodeS *CurrNode,TNodeS *AddNode,bool EnDelete = true);
  //
  TNodeS *NewLast();
  //
  TNodeS *NewByNamePath(svl::TString SPath); // return leaf
  void    NewFrom(TNodeSArray &InNodes);
  TNodeS *New(char *Name);
  //
  void Delete(TNodeS *DelNode);
  void Delete() { TArray::Clear();}
  //
  int     Count()           { return TArray::Numb();}
  TNodeS &Get(int N)        { return *(TNodeS*)TArray::Get(N);}
  int     Get(TNodeS *Node);
  //
  TNodeS &operator[](int     N)    { return *(TNodeS*)TArray::Get(N);}
  int     operator[](TNodeS *Node) { return Get(Node);}
  //
  TNodeS *SearchByName(TString Name);
  //
  void WriteTo(TString &To,TString SOffs = "");
  //
  //svl_BeginMap(TNodeSArray);
  //  //svl_MapP_DisableOutInfo(Parent);
  //svl_EndMap;
};

////////////////////////////////////////////////////////////////////////////////

struct TNodeS : /*public TMapped ,*/ public TArray_Object
{
  TNodeS     *Parent;
  TNodeSArray Children;
  TString       Name;
  TVariant   Value;
  //
  TNodeS();
  TNodeS(char *Name);
  //
  TNodeS *New(char *Name);
  //
  TString GetAsString(TString SOffs = "");
  //
  void BuildTo(TMem &Mem);
  void WriteTo(TString &To,TString SOffs = "");
  //
  //svl_BeginMap(TNodeS);
  //  svl_Map(Name);
  //  svl_Map(Value);
  //  //svl_MapP_DisableOutInfo(Parent);
  //  svl_Map(Children);
  //svl_EndMap;

private:
};

////////////////////////////////////////////////////////////////////////////////
}

#endif
